package com.linskating.wheat.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.linskating.wheat.model.domain.Team;
import com.linskating.wheat.model.domain.User;
import com.linskating.wheat.model.dto.TeamQuery;
import com.linskating.wheat.model.request.teamRequest.TeamDismissRequest;
import com.linskating.wheat.model.request.teamRequest.TeamJoinRequest;
import com.linskating.wheat.model.request.teamRequest.TeamQuitRequest;
import com.linskating.wheat.model.request.teamRequest.TeamUpdateRequest;
import com.linskating.wheat.model.vo.TeamUserVO;

import java.util.List;

/**
 * @author LinSk
 * @description 针对表【team(队伍)】的数据库操作Service
 * @createDate 2025-01-15 11:44:41
 */
public interface TeamService extends IService<Team> {

    /**
     * 创建队伍
     * @param team 创建队伍的信息
     * @param loginUser 创建队伍的用户
     * @return 返回队伍的id
     */
    long creatTeam(Team team, User loginUser);

    /**
     * 按条件查询队伍, 获取其队伍信息
     * @param teamQuery 查询队伍的条件
     * @param isNotAdmit 是否是管理员
     * @return 查询队伍信息结果列表
     */
    List<TeamUserVO> listTeam(TeamQuery teamQuery, boolean isNotAdmit);

    /**
     * 更新队伍信息
     * @param updateRequest 队伍的新信息
     * @param currentUser 当前操作的用户
     * @return 是否更新成功
     */
    boolean updateTeam(TeamUpdateRequest updateRequest, User currentUser);

    /**
     * 加入队伍
     * @param teamJoinRequest 加入队伍的相关信息（队伍id，密码）
     * @param currentUser 当前操作的用户
     * @return 是否加入成功
     */
    boolean joinTeam(TeamJoinRequest teamJoinRequest, User currentUser);

    /**
     * 退出队伍
     * @param teamQuitRequest 要退出队伍的id
     * @param currentUser 当前操作的用户
     * @return 是否退出成功
     */
    boolean quitTeam(TeamQuitRequest teamQuitRequest, User currentUser);

    /**
     * 队长或管理员解散队伍
     * @param teamDismissRequest 解散队伍id
     * @param currentUser 当前操作的用户
     * @return 是否成功解散队伍
     */
    boolean dismissTeam(TeamDismissRequest teamDismissRequest, User currentUser);

    /**
     * 管理员才能删除队伍
     * @param teamId 删除队伍id
     * @param notAdmit 是否是管理员
     * @return 是否删除成功
     */
    boolean deleteTeam(long teamId, boolean notAdmit);

    /**
     * 分页获取队伍列表，用于前端展示
     * @param thePageNum 当前第几页
     * @param pageSize 每页多少条数据
     * @param userId 用户id
     * @return 分页都Team对象列表
     */
    Page<TeamUserVO> getTeamPage(int thePageNum, int pageSize, Long userId);

    /**
     * 获取我能加入的队伍的总数
     * @param userId 用户id
     * @return 队伍总数
     */
    Long totalCount(Long userId);
}
